package de.hska.bestellverwaltung.rest;

import static de.hska.util.LogUtil.begin;
import static de.hska.util.LogUtil.end;
import static java.net.HttpURLConnection.HTTP_NOT_FOUND;

import java.net.URI;

import javax.ws.rs.ConsumeMime;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.ProduceMime;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import de.hska.bestellverwaltung.Bestellverwaltung;
import de.hska.bestellverwaltung.db.Bestellung;
import de.hska.kundenverwaltung.rest.KundenverwaltungResource;
import de.hska.util.JndiUtil;
import de.hska.util.Xlink;

@Path("/bestellverwaltung")
@ProduceMime("text/xml")
@ConsumeMime("text/xml")
public class BestellverwaltungResource {
	private static final Log LOG = LogFactory.getLog(BestellverwaltungResource.class);
	private static final boolean DEBUG = LOG.isDebugEnabled();
	private static final boolean TRACE = LOG.isTraceEnabled();

	@Context
	private UriInfo uriInfo;
	
	private Bestellverwaltung bv = JndiUtil.getBestellverwaltungLocal();


	/**
	 * Mit der URL /bestellverwaltung/bestellungen/{id} eine Bestellung ermitteln
	 * @param id ID der Bestellung
	 * @param uriInfo zur Ermittlung der Basis-URI f&uuml;r weitere Referenzen mittels XLink
	 * @return Objekt mit Bestelldaten, falls die ID vorhanden ist
	 * @throws WebApplicationException mit HTTP_NOT_FOUND, falls die ID nicht vorhanden ist
	 */
	@GET
	@Path("/bestellungen/{id}")
	public BestellungData findBestellung(@PathParam("id") Long id) {
		if (DEBUG) begin(LOG, id);
		
		Bestellung bestellung = null;
		try {
			bestellung = bv.findBestellungById(id);
		}
		catch (BestellungNotFoundException e) {
			final String msg = e.getMessage();
			final Response response = Response.status(HTTP_NOT_FOUND).type("text/plain").entity(msg).build();
			final WebApplicationException e2 = new WebApplicationException(response);
			if (DEBUG) end(LOG, e2);
			throw e2;
		}

		final URI kundeUri = uriInfo.getBaseUriBuilder().path(KundenverwaltungResource.class).path(KundenverwaltungResource.class, "findKunde").build(bestellung.getKunde().getId());
		final BestellungData data = toBestellungData(bestellung, kundeUri.toString());
		
		if (DEBUG) end(LOG, data);
		return data;
	}

	/**
	 * 
	 */
	public static BestellungData toBestellungData(Bestellung bestellung, String kundeUri) {
		if (DEBUG) begin(LOG, bestellung, kundeUri);
		
		if (bestellung == null) {
			if (DEBUG) end(LOG);
			return null;
		}
		
		final BestellungData data = new BestellungData();
		data.id = bestellung.getId();
		
		if (TRACE) LOG.trace(bestellung.getKunde());
		data.kundeRef = new Xlink(kundeUri);

		if (DEBUG) end(LOG, data);
		return data;
	}
}
